// 文件上传工具类
import { handle401Error, isDataCode401 } from './auth'

/**
 * 通用文件上传函数
 * @param {File} file - 要上传的文件
 * @param {string} prefix - 文件前缀路径
 * @returns {Promise} 上传结果
 */
export const uploadFile = async (file, prefix = 'avatar') => {
  const formData = new FormData()
  formData.append('file', file)
  
  try {
    // 使用代理路径，开发环境会代理到7001端口
    const response = await fetch(`/file/uploadFace/${prefix}`, {
      method: 'POST',
      headers: {
        'Authorization': localStorage.getItem('token')
      },
      body: formData
    })
    
    if (!response.ok) {
      if (response.status === 401) {
        // 处理401状态码
        await handle401Error()
      }
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    
    const result = await response.json()
    
    // 检查响应数据中的code字段
    if (isDataCode401(result)) {
      await handle401Error()
    }
    
    return result
  } catch (error) {
    console.error('文件上传失败:', error)
    throw error
  }
}

/**
 * 头像上传
 * @param {File} file - 头像文件
 * @returns {Promise} 上传结果
 */
export const uploadAvatar = (file) => {
  return uploadFile(file, 'avatar')
}

/**
 * 验证图片文件
 * @param {File} file - 文件对象
 * @param {Object} options - 验证选项
 * @returns {Object} 验证结果
 */
export const validateImageFile = (file, options = {}) => {
  const {
    maxSize = 2, // 最大文件大小（MB）
    allowedTypes = ['image/jpeg', 'image/png', 'image/jpg'], // 允许的文件类型
    minWidth = 0, // 最小宽度（像素）
    minHeight = 0 // 最小高度（像素）
  } = options
  
  const result = {
    valid: true,
    errors: []
  }
  
  // 检查文件类型
  if (!allowedTypes.includes(file.type)) {
    result.valid = false
    result.errors.push(`文件类型不支持，只支持 ${allowedTypes.map(type => type.split('/')[1]).join('、')} 格式`)
  }
  
  // 检查文件大小
  const fileSizeMB = file.size / 1024 / 1024
  if (fileSizeMB > maxSize) {
    result.valid = false
    result.errors.push(`文件大小不能超过 ${maxSize}MB，当前文件大小为 ${fileSizeMB.toFixed(2)}MB`)
  }
  
  // 如果需要检查图片尺寸，返回 Promise
  if (minWidth > 0 || minHeight > 0) {
    return new Promise((resolve) => {
      const img = new Image()
      img.onload = function() {
        if (this.width < minWidth) {
          result.valid = false
          result.errors.push(`图片宽度不能小于 ${minWidth}px，当前宽度为 ${this.width}px`)
        }
        if (this.height < minHeight) {
          result.valid = false
          result.errors.push(`图片高度不能小于 ${minHeight}px，当前高度为 ${this.height}px`)
        }
        resolve(result)
      }
      img.onerror = function() {
        result.valid = false
        result.errors.push('无法读取图片文件')
        resolve(result)
      }
      img.src = URL.createObjectURL(file)
    })
  }
  
  return result
}

/**
 * 验证文档文件（PDF/Word）
 * @param {File} file - 文件对象
 * @param {Object} options - 验证选项
 * @returns {Object} 验证结果
 */
export const validateDocumentFile = (file, options = {}) => {
  const {
    maxSize = 50, // 最大文件大小（MB）
    allowedTypes = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'], // 允许的文件类型
    allowedExtensions = ['.pdf', '.doc', '.docx'] // 允许的文件扩展名
  } = options
  
  const result = {
    valid: true,
    errors: []
  }
  
  // 检查文件扩展名
  const fileName = file.name.toLowerCase()
  const hasValidExtension = allowedExtensions.some(ext => fileName.endsWith(ext))
  
  if (!hasValidExtension) {
    result.valid = false
    result.errors.push(`仅支持上传 ${allowedExtensions.join('、')} 格式的文件`)
  }
  
  // 检查文件类型
  if (!allowedTypes.includes(file.type) && file.type !== '') {
    // 某些浏览器可能不会正确设置MIME类型，所以如果file.type为空，我们依赖扩展名检查
    if (file.type !== '') {
      result.valid = false
      result.errors.push(`文件类型不支持，当前类型：${file.type}`)
    }
  }
  
  // 检查文件大小
  const fileSizeMB = file.size / 1024 / 1024
  if (fileSizeMB > maxSize) {
    result.valid = false
    result.errors.push(`文件大小不能超过 ${maxSize}MB，当前文件大小为 ${fileSizeMB.toFixed(2)}MB`)
  }
  
  return result
}

/**
 * 获取文件扩展名
 * @param {String} fileName - 文件名
 * @returns {String} 文件扩展名（小写，包含点）
 */
export const getFileExtension = (fileName) => {
  const lastDotIndex = fileName.lastIndexOf('.')
  if (lastDotIndex === -1) return ''
  return fileName.substring(lastDotIndex).toLowerCase()
}

/**
 * 获取文件类型
 * @param {String} fileName - 文件名
 * @returns {String} 文件类型（pdf/doc/docx等）
 */
export const getFileType = (fileName) => {
  const extension = getFileExtension(fileName)
  return extension.replace('.', '')
}

export default {
  uploadFile,
  uploadAvatar,
  validateImageFile,
  validateDocumentFile,
  getFileExtension,
  getFileType
}
